package com.cy.pj.sys.web.controller;

import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.common.util.PageUtil;
import com.cy.pj.sys.pojo.SysNotice;
import com.cy.pj.sys.service.SysNoticeService;
import com.cy.pj.sys.web.pojo.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @RestController 注解描述的类成为控制层对象的处理器(Handler)
 *,通过此对象处理 DispatcherServlet(核心控制器-Controller)分发的请求,
 * 具体处理包括:
 * 1.请求url设计
 * 1)条件查询(请求方式-Get,请求url-"/notice/")
 * 2)新增公告(请求方式-post,请求url-"/notice/")
 * 3)基于id查询(请求方式-Get,请求url-"/notice/{id}"
 * 4)更新公告(请求方式-put,请求url-"/notice/")
 */

@RestController //@Controller+@ResponseBody
@RequestMapping("/notice/")
public class SysNoticeController {// handler
    //关联 service，将业务逻辑交给 service 对象处理
    @Autowired
    private SysNoticeService sysNoticeService;

    /**
     * 处理客户端的查询请求
     * 请求url：http://localhost/notice/(80可以省略)
     * 请求url：http://localhost/notice/?type=1&title=my
     */
    @GetMapping
    public JsonResult doFindNotices(SysNotice sysNotice){
        return new JsonResult(
                PageUtil.startPage().doSelectPageInfo(
                        ()->sysNoticeService.findNotices(sysNotice)));

        /**
         * lambda表达式应用，当接口内部只有一个方法时
         * 可以通过lambda的方式简化构建匿名内部类对象的过程
         * 例如：(参数列表)->{}
         */
//      return new JsonResult(PageHelper.startPage(1,3)//lambda简化写法
//              .doSelectPageInfo(()->{sysNoticeService.findNotices(sysNotice)}));

        //这个结果会返回给谁?调用方(DispatcherServlet)
        //方法调用方拿到方法执行结果后会调用相关api将结果转换为json字符串
        //最后通过响应对象将字符串响应到客户端
    }

    /**
     * 新增公告信息
     * @param sysNotice 封装客户端提交的通告信息，假如使用@RequestBody对参数
     * 进行描述，客户端可以向服务端传递json格式的字符串参数，服务器拿到字符串
     * 以后，会将json字符串转为参数类型的对象(这个过程可以理解为json反序列化)
     * 注意：一个Controller方法中只能有一个参数使用@RequestBody注解进行描述
     * @return
     */
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice sysNotice){
        sysNoticeService.saveNotice(sysNotice);
        return new JsonResult("save ok");//json序列化(将对象转换为json格式字符串
    }

    /**
     * rest风格的url中允许使用变量，但这个变量需要使用{}括起来
     * 当我们在方法参数中需要这个变量的值时，可以使用@PathVariable对
     * 方法参数进行描述
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable("id") Long id){
        return new JsonResult(sysNoticeService.findById(id));
    }


    /**
     * 更新公告信息
     * @param sysNotice 封装了公告信息的参数对象
     * @return
     */
    @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice sysNotice){
        sysNoticeService.updateNotice(sysNotice);
        return new JsonResult("update ok");
    }

    /**
     * 基于id执行删除任务
     * @param ids
     * @return
     */
    @DeleteMapping("{ids}")
    public JsonResult doDeleteById(@PathVariable Long... ids){
        int rows = sysNoticeService.deleteById(ids);
        if (rows==0){
            //throw new RuntimeException("记录可能已经不存在了");
            throw new ServiceException("记录可能已经不存在了");
        }
        return new JsonResult("delete ok");
    }
}
